const path = require("path");
const fs = require("fs");

/**
 * 为了解决KeepAlive 无法删除缓存的问题，要修改vue源码
 * 在Vite下，要先删除node_modules /.vite 文件夹，因为会缓存
 * 参考地址： https://www.cnblogs.com/shanfeng1000/p/16708878.html
 * @constructor
 */
export function KeepAlivePatch() {
    try {
        const vue_bundler_file = path.resolve(
            __dirname,
            "node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js"
        );
        //使用同步读取文件
        const data = fs.readFileSync(vue_bundler_file, "utf8");

        console.log("准备修改Keep源码：", vue_bundler_file);
        //如果未添加过
        if (data.indexOf("instance.$pruneCacheEntry") < 0) {
            console.log("正在修改源码文件");
            //先找到__v_cache变量的位置
            let index = data.indexOf("__v_cache");
            if (index >= 0) {
                // 继续找下一个大括号 }
                index = data.indexOf("}", index);
                if (index >= 0) {
                    //从下一个位置开始
                    index += 1;
                    //然后放一个可以释放的函数
                    const remove =
                        "        instance.$pruneCacheEntry = (key) => cache.get(key) && pruneCacheEntry(key);" as string;
                    //然后拼接
                    const result =
                        data.substring(0, index) +
                        "\r\n" +
                        remove +
                        "\r\n" +
                        data.substring(index);
                    fs.writeFileSync(vue_bundler_file, result, "utf8");
                }
            }
        } else {
            console.log("KeepAlive源码已被修改过,不会再修改：");
        }
    } catch (er: any) {
        console.error(er.message);
    }
}
